home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2001 May / SGI IRIX Base Documentation 2001 May.iso / usr / share / catman / u_man / cat1 / dplace.z / dplace
Encoding:
Text File  |  2001-04-17  |  23.5 KB  |  331 lines

  1.  
  2.  
  3.  
  4. DDDDPPPPLLLLAAAACCCCEEEE((((1111))))                                                            DDDDPPPPLLLLAAAACCCCEEEE((((1111))))
  5.  
  6.  
  7.  
  8. NNNNAAAAMMMMEEEE
  9.      ddddppppllllaaaacccceeee - a NUMA memory placement tool
  10.  
  11. SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
  12.      dplace [----ppppllllaaaacccceeee _p_l_a_c_e_m_e_n_t__f_i_l_e]
  13.      [----ddddaaaattttaaaa____ppppaaaaggggeeeessssiiiizzzzeeee _n-_b_y_t_e_s]
  14.      [----ddddaaaattttaaaa____llllppppaaaaggggeeee____wwwwaaaaiiiitttt [_o_f_f|_o_n]]
  15.      [----ssssttttaaaacccckkkk____ppppaaaaggggeeeessssiiiizzzzeeee _n-_b_y_t_e_s]
  16.      [----ssssttttaaaacccckkkk____llllppppaaaaggggeeee____wwwwaaaaiiiitttt [_o_f_f|_o_n]]
  17.      [----tttteeeexxxxtttt____ppppaaaaggggeeeessssiiiizzzzeeee _n-_b_y_t_e_s]
  18.      [----tttteeeexxxxtttt____llllppppaaaaggggeeee____wwwwaaaaiiiitttt [_o_f_f|_o_n]]
  19.      [----mmmmiiiiggggrrrraaaattttiiiioooonnnn [_o_f_f|_o_n|_t_h_r_e_s_h_o_l_d]]
  20.      [----mmmmiiiiggggrrrraaaattttiiiioooonnnn____lllleeeevvvveeeellll _t_h_r_e_s_h_o_l_d]
  21.      [----pppprrrrooooppppaaaaggggaaaatttteeee]
  22.      [----mmmmuuuussssttttrrrruuuunnnn]
  23.      [----vvvv[[[[eeeerrrrbbbboooosssseeee]]]]]
  24.      _p_r_o_g_r_a_m [_p_r_o_g_r_a_m-_a_r_g_u_m_e_n_t_s]
  25.  
  26.  
  27. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  28.      The given _p_r_o_g_r_a_m is executed after placement policies are set up
  29.      according to command line arguments and the specifications described in
  30.      _p_l_a_c_e_m_e_n_t__f_i_l_e.
  31.  
  32.  
  33. OOOOPPPPTTTTIIIIOOOONNNNSSSS
  34.      ----ppppllllaaaacccceeee _p_l_a_c_e_m_e_n_t__f_i_l_e
  35.           Placement information is read from _p_l_a_c_e_m_e_n_t__f_i_l_e. If this argument
  36.           is omitted, no input file is read. See ddddppppllllaaaacccceeee(5) for correct
  37.           placement file format.
  38.  
  39.      ----ddddaaaattttaaaa____ppppaaaaggggeeeessssiiiizzzzeeee _n-_b_y_t_e_s
  40.           Data and heap page sizes will be of size _n-_b_y_t_e_s. Valid page sizes
  41.           are 16k multiplied by a non negative integer powers of 4 up to a
  42.           maximum size of 16m. Valid page sizes are 16k, 64k, 256k, 1m, 4m,
  43.           and 16m.
  44.  
  45.      ----ddddaaaattttaaaa____llllppppaaaaggggeeee____wwwwaaaaiiiitttt [_o_f_f|_o_n]
  46.           Normal behavior in the event of large page shortages is to continue
  47.           running utilizing smaller pages instead. If this option is specified
  48.           as _o_n then the process will wait until large pages become available
  49.           for use by the data segment.
  50.  
  51.      ----ssssttttaaaacccckkkk____ppppaaaaggggeeeessssiiiizzzzeeee _n-_b_y_t_e_s
  52.           Stack page sizes will be of size _n-_b_y_t_e_s. Valid page sizes are 16k
  53.           multiplied by a non negative integer powers of 4 up to a maximum
  54.           size of 16m. Valid page sizes are 16k, 64k, 256k, 1m, 4m, and 16m.
  55.  
  56.      ----ssssttttaaaacccckkkk____llllppppaaaaggggeeee____wwwwaaaaiiiitttt [_o_f_f|_o_n]
  57.           Normal behavior in the event of large page shortages is to continue
  58.           running utilizing smaller pages instead. If this option is specified
  59.           as _o_n then the process will wait until large pages become available
  60.  
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. DDDDPPPPLLLLAAAACCCCEEEE((((1111))))                                                            DDDDPPPPLLLLAAAACCCCEEEE((((1111))))
  71.  
  72.  
  73.  
  74.           for use by the stack segment.
  75.  
  76.      ----tttteeeexxxxtttt____ppppaaaaggggeeeessssiiiizzzzeeee _n-_b_y_t_e_s
  77.           Text page sizes will be of size _n-_b_y_t_e_s. Valid page sizes are 16k
  78.           multiplied by a non negative integer powers of 4 up to a maximum
  79.           size of 16m. Valid page sizes are 16k, 64k, 256k, 1m, 4m, and 16m.
  80.  
  81.      ----tttteeeexxxxtttt____llllppppaaaaggggeeee____wwwwaaaaiiiitttt [_o_f_f|_o_n]
  82.           Normal behavior in the event of large page shortages is to continue
  83.           running utilizing smaller pages instead. If this option is specified
  84.           as _o_n then the process will wait until large pages become available
  85.           for use by the stack segment.
  86.  
  87.      ----mmmmiiiiggggrrrraaaattttiiiioooonnnn [_o_f_f|_o_n|_t_h_r_e_s_h_o_l_d]
  88.           Page migration is turned on or off. If a threshold is specified then
  89.           page migration will be turned on and the migration threshold will be
  90.           set in the same manner as when ----mmmmiiiiggggrrrraaaattttiiiioooonnnn____lllleeeevvvveeeellll is specified (see
  91.           below).
  92.  
  93.      ----mmmmiiiiggggrrrraaaattttiiiioooonnnn____lllleeeevvvveeeellll _t_h_r_e_s_h_o_l_d
  94.           Page migration threshold is set to _t_h_r_e_s_h_o_l_d.  This value specifies
  95.           the maximum percentage difference between the number of remote
  96.           memory accesses and local memory accesses (relative to maximum
  97.           counter values ) for a given page, before a migration request event
  98.           occurs. A special argument of 0 will turn page migration off. This
  99.           option is provided for backward compatibility only, new scripts
  100.           should use the ----mmmmiiiiggggrrrraaaattttiiiioooonnnn option (see above) instead.
  101.  
  102.      ----pppprrrrooooppppaaaaggggaaaatttteeee
  103.           Migration and page size information will be inherited by descendents
  104.           which are exec'ed.
  105.  
  106.      ----mmmmuuuussssttttrrrruuuunnnn
  107.           When threads are attached to memories or cpus, the threads are
  108.           attached to CPUs on the node using process_cpulink with a request
  109.           mode of mandatory.
  110.  
  111.      ----vvvveeeerrrrbbbboooosssseeee or ----vvvv
  112.           Detailed diagnostic information is written to standard error.
  113.  
  114. EEEEXXXXAAAAMMMMPPPPLLLLEEEE
  115.      To place data according to the file _p_l_a_c_e_m_e_n_t__f_i_l_e for the executable
  116.      a.out that would normally be run by:
  117.           %%%% aaaa....oooouuuutttt <<<< iiiinnnn >>>> oooouuuutttt
  118.      one would simply
  119.           %%%% ddddppppllllaaaacccceeee ----ppppllllaaaacccceeee ppppllllaaaacccceeeemmmmeeeennnntttt____ffffiiiilllleeee aaaa....oooouuuutttt <<<< iiiinnnn >>>> oooouuuutttt .
  120.  
  121.      An example placement file _p_l_a_c_e_m_e_n_t__f_i_l_e, when a.out is two threaded
  122.      might look like:
  123.  
  124.      #### ppppllllaaaacccceeeemmmmeeeennnntttt____ffffiiiilllleeee
  125.      mmmmeeeemmmmoooorrrriiiieeeessss 2222 iiiinnnn ttttooooppppoooollllooooggggyyyy ccccuuuubbbbeeee #### sssseeeetttt uuuupppp 2222 mmmmeeeemmmmoooorrrriiiieeeessss wwwwhhhhiiiicccchhhh aaaarrrreeee cccclllloooosssseeee
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. DDDDPPPPLLLLAAAACCCCEEEE((((1111))))                                                            DDDDPPPPLLLLAAAACCCCEEEE((((1111))))
  137.  
  138.  
  139.  
  140.      tttthhhhrrrreeeeaaaaddddssss 2222                   #### nnnnuuuummmmbbbbeeeerrrr ooooffff tttthhhhrrrreeeeaaaaddddssss
  141.      rrrruuuunnnn tttthhhhrrrreeeeaaaadddd 0000 oooonnnn mmmmeeeemmmmoooorrrryyyy 1111    #### rrrruuuunnnn tttthhhheeee ffffiiiirrrrsssstttt tttthhhhrrrreeeeaaaadddd oooonnnn tttthhhheeee 2222nnnndddd mmmmeeeemmmmoooorrrryyyy
  142.      rrrruuuunnnn tttthhhhrrrreeeeaaaadddd 1111 oooonnnn mmmmeeeemmmmoooorrrryyyy 0000    #### rrrruuuunnnn tttthhhheeee 2222nnnndddd tttthhhhrrrreeeeaaaadddd oooonnnn tttthhhheeee ffffiiiirrrrsssstttt mmmmeeeemmmmoooorrrryyyy
  143.  
  144.  
  145.      This specification, would request 2 nearby memories from the operating
  146.      system. At creation, the threads are requested to run on an available cpu
  147.      which is local to the specified memory. As data and stack space is
  148.      touched or faulted in, physical memory is allocated from the memory which
  149.      is local to the thread which initiated the fault.
  150.  
  151.      This can be written in a _s_c_a_l_a_b_l_e way for a variable number of threads
  152.      using the environment variable NP as follows:
  153.  
  154.      #### ssssccccaaaallllaaaabbbblllleeee ppppllllaaaacccceeeemmmmeeeennnntttt____ffffiiiilllleeee
  155.      mmmmeeeemmmmoooorrrriiiieeeessss $$$$NNNNPPPP iiiinnnn ttttooooppppoooollllooooggggyyyy ccccuuuubbbbeeee #### sssseeeetttt uuuupppp mmmmeeeemmmmoooorrrriiiieeeessss wwwwhhhhiiiicccchhhh aaaarrrreeee cccclllloooosssseeee
  156.      tttthhhhrrrreeeeaaaaddddssss $$$$NNNNPPPP                   #### nnnnuuuummmmbbbbeeeerrrr ooooffff tttthhhhrrrreeeeaaaaddddssss
  157.      #### rrrruuuunnnn tttthhhheeee llllaaaasssstttt tttthhhhrrrreeeeaaaadddd oooonnnn tttthhhheeee ffffiiiirrrrsssstttt mmmmeeeemmmmoooorrrryyyy eeeettttcccc....
  158.      ddddiiiissssttttrrrriiiibbbbuuuutttteeee tttthhhhrrrreeeeaaaaddddssss $$$$NNNNPPPP----1111::::0000::::----1111 aaaaccccrrrroooossssssss mmmmeeeemmmmoooorrrriiiieeeessss
  159.  
  160.  
  161.  
  162. UUUUSSSSIIIINNNNGGGG MMMMPPPPIIII
  163.      Since most MPI implementations use $MPI_NP+1 threads; where the first
  164.      thread is mainly inactive. One might use the placement file:
  165.  
  166.      #### ssssccccaaaallllaaaabbbblllleeee ppppllllaaaacccceeeemmmmeeeennnntttt____ffffiiiilllleeee ffffoooorrrr MMMMPPPPIIII
  167.      mmmmeeeemmmmoooorrrriiiieeeessss (((($$$$MMMMPPPPIIII____NNNNPPPP ++++ 1111))))////2222 iiiinnnn ttttooooppppoooollllooooggggyyyy ccccuuuubbbbeeee #### sssseeeetttt uuuupppp mmmmeeeemmmmoooorrrriiiieeeessss wwwwhhhhiiiicccchhhh aaaarrrreeee cccclllloooosssseeee
  168.      tttthhhhrrrreeeeaaaaddddssss $$$$MMMMPPPPIIII____NNNNPPPP ++++ 1111                   #### nnnnuuuummmmbbbbeeeerrrr ooooffff tttthhhhrrrreeeeaaaaddddssss
  169.      #### iiiiggggnnnnoooorrrreeee tttthhhheeee llllaaaazzzzyyyy tttthhhhrrrreeeeaaaadddd
  170.      ddddiiiissssttttrrrriiiibbbbuuuutttteeee tttthhhhrrrreeeeaaaaddddssss 1111::::$$$$MMMMPPPPIIII____NNNNPPPP aaaaccccrrrroooossssssss mmmmeeeemmmmoooorrrriiiieeeessss
  171.  
  172.  
  173.      When using MPI with ddddppppllllaaaacccceeee, syntax similar to the following should be
  174.      used:
  175.           mmmmppppiiiirrrruuuunnnn ----nnnnpppp <<<<nnnnuuuummmmbbbbeeeerrrr____ooooffff____pppprrrroooocccceeeesssssssseeeessss>>>> ddddppppllllaaaacccceeee <<<<ddddppppllllaaaacccceeee____aaaarrrrggggssss>>>> aaaa....oooouuuutttt
  176.  
  177.  
  178. LLLLAAAARRRRGGGGEEEE PPPPAAAAGGGGEEEESSSS
  179.      Some applications run more efficiently using large pages.  To run a
  180.      program a.out utilizing 64k pages for both stack and data, a placement
  181.      file is not necessary. One need only invoke the command:
  182.           ddddppppllllaaaacccceeee ----ddddaaaattttaaaa____ppppaaaaggggeeeessssiiiizzzzeeee 66664444kkkk ----ssssttttaaaacccckkkk____ppppaaaaggggeeeessssiiiizzzzeeee 66664444kkkk aaaa....oooouuuutttt
  183.      from the shell.
  184.  
  185.  
  186. PPPPHHHHYYYYSSSSIIIICCCCAAAALLLL PPPPLLLLAAAACCCCEEEEMMMMEEEENNNNTTTT
  187.      Physical placement can also be accomplished using dplace. The following
  188.      placement file:
  189.  
  190.  
  191.      #### pppphhhhyyyyssssiiiiccccaaaallll ppppllllaaaacccceeeemmmmeeeennnntttt____ffffiiiilllleeee ffffoooorrrr 3333 ssssppppeeeecccciiiiffffiiiicccc mmmmeeeemmmmoooorrrriiiieeeessss aaaannnndddd 6666 tttthhhhrrrreeeeaaaaddddssss
  192.  
  193.  
  194.  
  195.                                                                         PPPPaaaaggggeeee 3333
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. DDDDPPPPLLLLAAAACCCCEEEE((((1111))))                                                            DDDDPPPPLLLLAAAACCCCEEEE((((1111))))
  203.  
  204.  
  205.  
  206.      mmmmeeeemmmmoooorrrriiiieeeessss 3333 iiiinnnn ttttooooppppoooollllooooggggyyyy pppphhhhyyyyssssiiiiccccaaaallll nnnneeeeaaaarrrr \\\\
  207.           ////hhhhwwww////mmmmoooodddduuuulllleeee////2222////ssssllllooootttt////nnnn4444////nnnnooooddddeeee \\\\
  208.           ////hhhhwwww////mmmmoooodddduuuulllleeee////3333////ssssllllooootttt////nnnn2222////nnnnooooddddeeee \\\\
  209.           ////hhhhwwww////mmmmoooodddduuuulllleeee////4444////ssssllllooootttt////nnnn3333////nnnnooooddddeeee
  210.      tttthhhhrrrreeeeaaaaddddssss 6666
  211.      ####tttthhhheeee ffffiiiirrrrsssstttt  ttttwwwwoooo tttthhhhrrrreeeeaaaaddddssss ((((0000 &&&& 1111 )))) wwwwiiiillllllll rrrruuuunnnn oooonnnn ////hhhhwwww////mmmmoooodddduuuulllleeee////2222////ssssllllooootttt////nnnn4444////nnnnooooddddeeee
  212.      ####tttthhhheeee sssseeeeccccoooonnnndddd ttttwwwwoooo tttthhhhrrrreeeeaaaaddddssss ((((2222 &&&& 3333 )))) wwwwiiiillllllll rrrruuuunnnn oooonnnn ////hhhhwwww////mmmmoooodddduuuulllleeee////3333////ssssllllooootttt////nnnn2222////nnnnooooddddeeee
  213.      ####tttthhhheeee llllaaaasssstttt   ttttwwwwoooo tttthhhhrrrreeeeaaaaddddssss ((((4444 &&&& 5555 )))) wwwwiiiillllllll rrrruuuunnnn oooonnnn ////hhhhwwww////mmmmoooodddduuuulllleeee////4444////ssssllllooootttt////nnnn3333////nnnnooooddddeeee
  214.      ddddiiiissssttttrrrriiiibbbbuuuutttteeee tttthhhhrrrreeeeaaaaddddssss aaaaccccrrrroooossssssss mmmmeeeemmmmoooorrrriiiieeeessss
  215.  
  216.  
  217.      specifies three physical nodes using the proper /hw path. To find out the
  218.      names of the memory nodes on the machine you are using, type "find /hw
  219.      -name node -print" at the shell command prompt.
  220.  
  221.  
  222. MMMMUUUUSSSSTTTTRRRRUUUUNNNN
  223.      The mustrun option will bind a thread to a particular CPU on the node.
  224.      In cases where threads are distributed across memories, the CPU selection
  225.      will attempt to schedule CPUs as to maximize CPU to memory bandwidth.
  226.      For example, on an Origin 3000, CPUs sharing a memory will be scheduled
  227.      on two separate processor busses available on the node, which serves to
  228.      increase available memory bandwidth for each processor.  The following
  229.      placement file will demonstrate this behaviour:
  230.  
  231.  
  232.      #### ppppllllaaaacccceeeemmmmeeeennnntttt ffffiiiilllleeee ffffoooorrrr 4444 mmmmeeeemmmmoooorrrriiiieeeessss aaaannnndddd 8888 tttthhhhrrrreeeeaaaaddddssss
  233.      tttthhhhrrrreeeeaaaaddddssss 8888
  234.      mmmmeeeemmmmoooorrrriiiieeeessss 4444
  235.      ddddiiiissssttttrrrriiiibbbbuuuutttteeee tttthhhhrrrreeeeaaaaddddssss aaaaccccrrrroooossssssss mmmmeeeemmmmoooorrrriiiieeeessss
  236.  
  237.  
  238.      By running this placement file using the option -_m_u_s_t_r_u_n the CPU
  239.      selection on each memory of an Origin 3000 will attempt to select CPU
  240.      numbers 0 and 2, or 1 and 3, or 0 and 3, or 1 and 2. The selection will
  241.      avoid pairing 0 and 1, or 2 and 3, as these CPUs share a processor
  242.      interface bus. In a situation where a processor selection cannot be done
  243.      optimally as described, then the next available CPU regardless of bus
  244.      attachment will be selected.
  245.  
  246.  
  247.  
  248. DDDDEEEEFFFFAAAAUUUULLLLTTTTSSSS
  249.      If command line arguments are omitted, dplace chooses the following set
  250.      of defaults:
  251.  
  252.           ppppllllaaaacccceeee           ////ddddeeeevvvv////nnnnuuuullllllll
  253.           ddddaaaattttaaaa____ppppaaaaggggeeeessssiiiizzzzeeee   11116666kkkk
  254.           ssssttttaaaacccckkkk____ppppaaaaggggeeeessssiiiizzzzeeee  11116666kkkk
  255.           tttteeeexxxxtttt____ppppaaaaggggeeeessssiiiizzzzeeee   11116666kkkk
  256.           mmmmiiiiggggrrrraaaattttiiiioooonnnn       ooooffffffff
  257.           pppprrrrooooppppaaaaggggaaaatttteeee       ooooffffffff
  258.  
  259.  
  260.  
  261.                                                                         PPPPaaaaggggeeee 4444
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. DDDDPPPPLLLLAAAACCCCEEEE((((1111))))                                                            DDDDPPPPLLLLAAAACCCCEEEE((((1111))))
  269.  
  270.  
  271.  
  272.          mmmmuuuussssttttrrrruuuunnnn         ooooffffffff
  273.           vvvveeeerrrrbbbboooosssseeee         ooooffffffff
  274.  
  275.  
  276. RRRREEEESSSSTTTTRRRRIIIICCCCTTTTIIIIOOOONNNNSSSS
  277.      Programs must be dynamic executables; non shared executables behavior are
  278.      are unaffected by ddddppppllllaaaacccceeee. Placement files will only affect direct
  279.      descendents of dplace. Parallel applications must be based on the
  280.      sssspppprrrroooocccc(2) or ffffoooorrrrkkkk(2) mechanism. Page sizes for regions which are not
  281.      stack, text, or data can not be specified with dplace (eg: SYSV shared
  282.      memory). Regions shared by multiple processes (eg: DSO text) are faulted
  283.      in with the pagesize settings of the faulting process.  Dplace sets the
  284.      environment variable _DSM_OFF which will disable lllliiiibbbbmmmmpppp's own DSM
  285.      directives and environment variables.
  286.  
  287.  
  288. EEEENNNNVVVVIIIIRRRROOOONNNNMMMMEEEENNNNTTTT
  289.      Dplace recognizes and uses the environment variables PAGESIZE_DATA,
  290.      PAGESIZE_STACK and PAGESIZE_TEXT. When using these variables it is
  291.      important to note that the units are in kilobytes.  The command line
  292.      option will override environment variable setting.
  293.  
  294.  
  295. EEEERRRRRRRROOOORRRRSSSS
  296.      If errors are encountered in the _p_l_a_c_e_m_e_n_t__f_i_l_e, the default procedure
  297.      for ddddppppllllaaaacccceeee is to print a diagnostic message to standard error specifying
  298.      where the error occurred in the _p_l_a_c_e_m_e_n_t__f_i_l_e and abort execution.  If
  299.      errors are encountered in the libdplace.so library during the run-time
  300.      execution of _p_r_o_g_r_a_m, then a diagnostic message is sent to standard
  301.      error, a default signal of SIGKILL is sent to all members of the process
  302.      group, and execution is aborted.
  303.  
  304.      The mmmmooooddddeeee ssssiiiiggggnnnnaaaallll eeeexxxxpppprrrr statement allows a selection of a specific signal
  305.      number to be generated upon error.  If the mmmmooooddddeeee ssssiiiiggggnnnnaaaallll eeeexxxxpppprrrr is specified,
  306.      the action taken when libdplace.so detects a run-time error is to send
  307.      the signal number derived from eeeexxxxpppprrrr to the _p_r_o_g_r_a_m invoked by ddddppppllllaaaacccceeee.
  308.      Under this condition the control is returned to the caller, which is the
  309.      _p_r_o_g_r_a_m.  The signal number can range from 1 to 32.
  310.  
  311.      An example of how to set the signal number:
  312.  
  313.      mmmmooooddddeeee ssssiiiiggggnnnnaaaallll 11116666
  314.  
  315.      Upon detecting an error in libdplace.so during run-time, signal 16
  316.      (defined as SIGUSR1) is sent to the calling process (in this case the
  317.      _p_r_o_g_r_a_m and control is returned to the caller.
  318.  
  319.  
  320. SSSSEEEEEEEE AAAALLLLSSSSOOOO
  321.      ddddppppllllaaaacccceeee(3), ddddppppllllaaaacccceeee(5), ddddpppprrrrooooffff(1), nnnnuuuummmmaaaa(5), mmmmmmmmcccciiii(5), ddddllllooooooookkkk(1), nnnnuuuummmmaaaa____vvvviiiieeeewwww((((1111)))),
  322.      mmmmlllldddd((((3333)))).
  323.  
  324.  
  325.  
  326.  
  327.                                                                         PPPPaaaaggggeeee 5555
  328.  
  329.  
  330.  
  331.